from django.db import models

from BYD_ERP.utils.base_model import BaseModel

# python ../../manage.py startapp financial_info

# 迁移基础：erp_system, basic_info, purchase_info, warehouse_info, sale_info

# python ../../manage.py makemigrations financial_info
# python ../../manage.py migrate financial_info

# python ../../manage.py check

# 货币种类
currency_choices = (
    ('CNY', '人民币'),
    ('USD', '美元'),
    ('EUR', '欧元'),
    ('JPY', '日元')
)

# 付款类型
pay_choice = (
    ('1', '采购货款'),
    ('2', '采购定金'),
    ('3', '尾款支付'),
    ('4', '其他付款')
)


# 付款单的模型类
class PaymentModel(BaseModel):
    pay_date = models.DateTimeField('付款日期')
    number_code = models.CharField('单据编号，不让用户填写', max_length=28)
    discount_money = models.DecimalField('付款优惠（优惠金额），最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True,
                                         null=True)
    total_money = models.DecimalField('合计需要付款金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    pay_should_money = models.DecimalField('当前应付金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    this_money = models.DecimalField('本次实际付款金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    remark = models.CharField('备注', max_length=512, blank=True, null=True)
    currency = models.CharField('货币种类', max_length=20, null=True, choices=currency_choices, default='CNY')
    pay_category = models.CharField('付款类型（定金，全款，尾款）', max_length=2, null=True, choices=pay_choice, default='1')
    status = models.CharField('付款单的状态，0：未审核，1：已审核', max_length=1, default='0')

    account = models.ForeignKey('basic_info.SettlementAccountModel', blank=True, null=True, on_delete=models.SET_NULL,
                                verbose_name='结算账户，审核之后不能修改')
    operator_user = models.ForeignKey('erp_system.UserModel', related_name='operator_pay_list', null=True, blank=True,
                                      on_delete=models.SET_NULL, verbose_name='制单人，不能修改')

    # 增加一个冗余字段
    operator_user_name = models.CharField('财务人员的真实姓名', max_length=20, blank=True, null=True)
    check_fin_user = models.ForeignKey('erp_system.UserModel', related_name='check_fin_pay_list', blank=True, null=True,
                                       on_delete=models.SET_NULL, verbose_name='财务审核，不能修改')

    # 增加一个冗余字段
    check_fin_user_name = models.CharField('财务审核的真实姓名', max_length=20, blank=True, null=True)

    check_gen_user = models.ForeignKey('erp_system.UserModel', related_name='check_gen_pay_list', blank=True, null=True,
                                       on_delete=models.SET_NULL, verbose_name='总经理审核，不能修改')

    # 增加一个冗余字段
    check_gen_user_name = models.CharField('总经理审核的真实姓名', max_length=20, blank=True, null=True)

    supplier = models.ForeignKey('basic_info.SupplierModel', related_name='supplier_list', blank=True, null=True,
                                 on_delete=models.SET_NULL, verbose_name='供应商，审核之后不能修改')
    # 增加一个冗余字段
    supplier_name = models.CharField('供应商全称', max_length=30, blank=True, null=True)

    purchase_order = models.ForeignKey('purchase_info.PurchaseOrderModel', related_name='purchase_order_list',
                                       blank=True, null=True,
                                       on_delete=models.SET_NULL, verbose_name='关联的采购订单，审核之后不能修改')
    # 采购入库单的状态，0：未审核，1：已审核，2：部分付款，3：付款完成（包含欠款）
    # 采购订单的状态/采购单的状态，0：未审核，1：已审核，2：部分入库，3：全部入库，4：已付定金，5：完成采购（货全部入库，付全款完成）

    attachment_list = models.CharField('附件的ID列表，例如：采购合同、银行付款凭证，字段的值为：1,2,3,4', max_length=20, blank=True, null=True)

    class Meta:
        db_table = 't_payment'
        verbose_name = '付款单表'
        verbose_name_plural = verbose_name
        ordering = ['id']


# 付款单中付款项目（对应同一个采购订单中的多个采购入库单）的模型类
# 同一个采购订单中对应的多个入库单可以一起付款
class PaymentItemModel(BaseModel):
    # 冗余字段
    storage_code = models.CharField('采购入库单编号，不让用户填写', max_length=28)
    purchase_in_storage = models.ForeignKey('warehouse_info.InStorageModel', related_name='in_storage_item_list',
                                            blank=True, null=True, on_delete=models.SET_NULL,
                                            verbose_name='关联的采购入库单，审核之后不能修改')
    payment = models.ForeignKey('PaymentModel', related_name='item_list', blank=True, null=True,
                                on_delete=models.SET_NULL, verbose_name='关联的付款单，审核之后不能修改')
    total_money = models.DecimalField('当前采购入库单中总金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    should_money = models.DecimalField('当前剩余应付金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    this_money = models.DecimalField('本次实付金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    remark = models.CharField('备注', max_length=512, blank=True, null=True)

    class Meta:
        db_table = 't_payment_items'
        verbose_name = '付款单中付款项目表'
        verbose_name_plural = verbose_name
        ordering = ['id']


# 收款类型
rece_choice = (
    ('1', '销售货款'),
    ('2', '销售定金'),
    ('3', '尾款回收'),
    ('4', '其他收款')
)


# 收款单的模型类
class ReceiptModel(BaseModel):
    rece_date = models.DateTimeField('收款日期')
    number_code = models.CharField('单据编号，不让用户填写', max_length=28)
    discount_money = models.DecimalField('收款优惠（优惠金额），最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True,
                                         null=True)
    total_money = models.DecimalField('合计需要收款金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    rece_should_money = models.DecimalField('当前应收金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True,
                                            null=True)
    this_money = models.DecimalField('本次实际收款金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    remark = models.CharField('备注', max_length=512, blank=True, null=True)
    currency = models.CharField('货币种类', choices=currency_choices, max_length=20, null=True, default='CNY')
    rece_category = models.CharField('收款类型（定金，全款，尾款）', choices=rece_choice, max_length=2, null=True, default='1')
    status = models.CharField('收款单的状态，0：未审核，1：已审核', max_length=1, default='0')

    account = models.ForeignKey('basic_info.SettlementAccountModel', blank=True, null=True, on_delete=models.SET_NULL,
                                verbose_name='结算账户，审核之后不能修改')
    operator_user = models.ForeignKey('erp_system.UserModel', related_name='operator_rece_list', null=True, blank=True,
                                      on_delete=models.SET_NULL, verbose_name='制单人，不能修改')

    # 增加一个冗余字段
    operator_user_name = models.CharField('制单人的真实姓名', max_length=20, blank=True, null=True)
    check_user = models.ForeignKey('erp_system.UserModel', related_name='check_rece_list', blank=True, null=True,
                                   on_delete=models.SET_NULL, verbose_name='审核人员，不能修改')

    # 增加一个冗余字段
    check_user_name = models.CharField('审核人员的真实姓名', max_length=20, blank=True, null=True)

    customer = models.ForeignKey('basic_info.CustomerModel', related_name='customer_list', blank=True, null=True,
                                 on_delete=models.SET_NULL, verbose_name='客户，审核之后不能修改')
    # 增加一个冗余字段
    customer_name = models.CharField('客户全称', max_length=30, blank=True, null=True)

    sale_order = models.ForeignKey('sale_info.SaleOrderModel', related_name='sale_order_list', blank=True, null=True,
                                   on_delete=models.SET_NULL, verbose_name='关联的销售订单，审核之后不能修改')

    # out_storage出库单的状态，0：未审核，1：已审核，2：部分收款，3：收款完成（包含欠款）
    # sale_order销售订单的状态，0：未审核，1：已审核，2：部分出库，3：全部出库，4：收取定金，5：完成销售（此订单货全部出库，全款已收）

    attachment_list = models.CharField('附件的ID列表，例如：销售合同、银行收款凭证等，字段的值为：1,2,3,4', max_length=20, blank=True, null=True)

    class Meta:
        db_table = 't_receipt'
        verbose_name = '收款单表'
        verbose_name_plural = verbose_name
        ordering = ['id']


# 收款单中收款项目（对应同一个销售订单中的多个销售出库单）的模型类
# 同一个销售订单中对应的多个出库单可以一起付款
class ReceiptItemModel(BaseModel):
    # 冗余字段
    out_storage_code = models.CharField('（销售）出库单编号，不让用户填写', max_length=28)
    out_storage = models.ForeignKey('warehouse_info.OutStorageModel', related_name='out_storage_item_list', blank=True,
                                    null=True, on_delete=models.SET_NULL, verbose_name='关联的（销售）出库单，审核之后不能修改')
    receipt = models.ForeignKey('ReceiptModel', related_name='item_list', blank=True, null=True,
                                on_delete=models.SET_NULL, verbose_name='关联的收款单，审核之后不能修改')
    total_money = models.DecimalField('当前（销售）出库单中总金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True,
                                      null=True)
    should_money = models.DecimalField('当前剩余应收金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    this_money = models.DecimalField('本次实收金额，最多精确到小数点后两位', max_digits=10, decimal_places=2, blank=True, null=True)
    remark = models.CharField('备注', max_length=512, blank=True, null=True)

    class Meta:
        db_table = 't_receipt_items'
        verbose_name = '收款单中收款项目表'
        verbose_name_plural = verbose_name
        ordering = ['id']
